
你是不是遇到过这种情况?公司MySQL数据库在内网,但你需要在家加班查数据,或者给异地同事开放临时访问权限。直接暴露数据库到公网?太危险!不开放?工作又没法推进。别急,我来分享几种既安全又实用的远程访问方案。
为什么直接开放3306端口是作死行为
上周我帮朋友处理了个数据库入侵事件,他们图省事直接把MySQL的3306端口映射到公网,结果被黑客扫到,整个用户表被加密勒索。这不是个例,Shodan搜索引擎上每天都能抓到成千上万暴露的MySQL实例。
安全访问内网数据库的核心原则就两点:
- 不让数据库直接暴露在互联网
- 所有传输数据必须加密
方法一:SSH隧道 - 程序员最爱的方式
这就像给你的数据库连接套了个防弹衣。假设你的内网数据库IP是192.168.1.100,公司跳板机公网IP是203.0.113.5:
ssh -L 3307:192.168.1.100:3306 user@203.0.113.5 -N
这个命令会在本地创建3307端口,所有发往这个端口的数据都会通过SSH加密隧道传到内网数据库。用Navicat或DBeaver连接时,主机填127.0.0.1,端口填3307,账号密码还是内网那套。
优点:
- 全程加密,不怕抓包
- 不用改MySQL配置
- 临时用完关掉就行
缺点:
- 需要有个公网跳板机
- 网络延迟可能增加
方法二:VPN接入 - 团队协作首选
我们团队用WireGuard组建了虚拟内网,所有设备就像在同一个局域网。配置好之后,直接连192.168.1.100:3306就像在公司一样。
相比传统VPN,WireGuard的优势很明显:
- 配置简单,客户端一个配置文件搞定
- 性能损耗小,我测试延迟只增加3-5ms
- 支持动态IP,出差换网络自动重连
记得设置防火墙规则,只允许VPN网段访问3306端口:
GRANT ALL ON *.* TO 'vpn_user'@'10.8.0.%' IDENTIFIED BY '强密码';
方法三:MySQL SSL连接 - 数据库专家的选择
如果必须让数据库能被直接连接(比如云数据库),务必启用SSL加密:
- 生成证书(MySQL 8.0+自带自动生成功能)
- 修改my.cnf:
[mysqld] ssl-ca=/etc/mysql/ca.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem
- 强制用户使用SSL:
ALTER USER 'remote_user'@'%' REQUIRE SSL;
连接时客户端也要配置证书,这样即使流量被截获也无法解密。用这个命令测试SSL是否生效:
SHOW STATUS LIKE 'Ssl_cipher';
重要安全提醒
无论用哪种方法,都要做好这三件事:
- 定期更换密码和密钥
- 设置数据库账号的IP白名单
- 开启MySQL的查询日志审计
最近帮客户做安全审计时发现,有个开发账号密码三年没改,离职员工还能随时访问,吓得客户连夜改了所有凭证。
该选哪种方案?
- 个人临时用 → SSH隧道
- 固定团队 → VPN
- 必须开放公网 → SSL+IP白名单
上周我用SSH隧道+本地Navicat成功帮上海分公司的同事解决了报表问题,整个过程就像直接连内网一样流畅,还不用折腾网络组开权限。
你有更好的远程访问方案吗?欢迎在评论区分享你的实战经验!遇到具体问题也可以留言,我会挑典型案例在下期详细解答。
